<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// 1、被`try`包裹的代码块一旦出现`Error`,会将`Error`传递给`catch`并运行`catch`代码块。不会影响后续代码运行。
	// {
	// 	try{
	// 		let a = 1;
	// 		let b = 2;
	// 		let obj = {
	// 			userName:"zhangsan",
	// 			age:12
	// 		}
	// 		console.log("start");
	// 		// a();// TypeError: a is not a function
	// 		obj.fn();// TypeError: obj.fn is not a function
	// 		console.log(a+b);
	// 	}catch (err){
	// 		console.error("catch",err)
	// 	}
	// 	console.log("over")
	// }
	
	// 2、出现`SyntaxError`（语法错误），不会被抛出(无法捕获语法错误)
	// try {
	// 	let obj = {
	// 		a():1
	// 	}
	// } catch (e) {
	// 	// 不会输出
	// 	console.log("catch");
	// }
	
	
	// 3、通过 throw new Error 抛出错误
	// {
	// 	try{
	// 		// throw的右侧可以是任意类型的数据。右侧的值即是catch接收的值
	// 		// throw "abc";
	// 		// throw 1;
	//
	// 		throw  new Error("异常")
	// 		console.log("over");// 不执行
	// 	}catch (err){
	// 		// console.log("catch",err);
	// 		// console.log("catch",err.message);// err.message 是Error构造函数被实例化时接收的参数
	// 		// console.log("catch",err.stack);// 报错异常具体的内容
	//
	// 	}
	// }
	
	
	
	// 4、不管有没有异常，finally中的代码都会在try和catch之后执行.
	// {
	// 	try{
	// 		throw "异常"
	// 	}catch (err){
	// 		console.log("catch");
	// 	}finally {
	// 		console.log("finally,不管try当中有没有异常均会执行，如果有异常，先执行catch再执行finally")
	// 	}
	// }
	// 注意：try必须与catch结合使用。finally可以省略。
	//
	// 注意：try...catch无法捕获异步函数中的异常
	{
		// 只可以捕获同步的代码异常，异步函数的异常无法捕获
		try{
			setTimeout(function(){
				try{
					throw "异常";
				}catch (err){
					console.log("catch2",err)
				}
				
			})
		}catch (err){
			console.log("catch",err)
		}
	}
	
</script>
</html>